package com.nidu.demo.dept.gateway;

import com.alibaba.cola.dto.PageResponse;
import com.nidu.demo.dept.model.Department;
import com.nidu.demo.dept.model.DepartmentCriteria;

import java.util.List;
import java.util.Set;

/**
 * 部门网关接口
 * 供领域层调用，实现跨上下文/基础设施的部门数据访问
 *
 * @author auto
 */
public interface DepartmentGateway {

    /**
     * 创建部门
     *
     * @param dept 部门信息
     * @return 创建后的部门
     */
    Department create(Department dept);

    /**
     * 修改部门
     *
     * @param dept 部门信息
     * @return 修改后的部门
     */
    Department update(Department dept);

    /**
     * 删除单个部门
     *
     * @param id 部门ID
     */
    void deleteById(Long id);

    /**
     * 批量删除部门
     *
     * @param ids 部门ID列表
     */
    void deleteByIds(Set<Long> ids);

    /**
     * 根据部门ID查询
     *
     * @param id 部门ID
     * @return 部门信息
     */
    Department getById(Long id);

    /**
     * 根据部门ID列表查询
     * @param ids 部门ID列表
     * @return 部门列表
     */
    List<Department> getByIds(Set<Long> ids);

    /**
     * 根据部门编码和公司ID查询
     *
     * @param code 部门编码
     * @param companyId 公司ID
     * @return 部门信息
     */
    Department getByCodeAndCompanyId(String code, Long companyId);

    /**
     * 根据父部门ID查询
     * @param parentId 父部门ID
     * @return 部门列表
     */
    List<Department> getByParentId(Long parentId);

    /**
     * 列表查询
     * @param criteria 查询条件
     * @return 部门列表
     */
    List<Department> listByCondition(DepartmentCriteria criteria);

    /**
     * 树形部门列表查询
     * @param criteria 查询条件
     * @return 部门列表
     */
    List<Department> treeByCondition(DepartmentCriteria criteria);


    /**
     * 树形部门分页查询
     * @param criteria 查询条件
     * @return 部门分页列表
     */
    PageResponse<Department> pageByCondition(DepartmentCriteria criteria);

    /**
     * 更新部门状态
     * @param id 部门ID
     * @param status 状态值
     */
    void updateStatus(Long id, Integer status);

    /**
     * 根据ancestors查询所有子部门ID
     * @param deptId 部门ID
     * @return 所有子部门ID列表（包含自身）
     */
    Set<Long> getAllChildrenIds(Long deptId);

}